package com.linkhub.oms.common.util;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.ObjectUtil;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import org.apache.commons.lang3.StringUtils;

import java.util.Collection;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.function.Consumer;
import java.util.function.Function;

/**
 * @Description: Optional工具类
 * @Author: echo
 * @Date: 2020/11/27 14:45
 * @Version: 1.0
 */
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class QtOptionalUtil {

    /**
     * 空集合支持Optional调用
     *
     * @param collection 集合
     * @return Optional
     */
    public static <T, C extends Collection<T>> Optional<C> of(C collection) {
        return CollUtil.isNotEmpty(collection) ? Optional.of(collection) : Optional.empty();
    }

    /**
     * 空Map支持Optional调用
     *
     * @param map Map集
     * @return Optional
     */
    public static <K, V, M extends Map<K, V>> Optional<M> of(M map) {
        return MapUtil.isNotEmpty(map) ? Optional.of(map) : Optional.empty();
    }

    /**
     * 空字符串返回空的{@link Optional}
     *
     * @param str 字符串
     * @return Optional
     */
    public static Optional<String> of(String str) {
        return StringUtils.isNotBlank(str) ? Optional.of(str) : Optional.empty();
    }

    /**
     * 对象返回空的{@link Optional}
     *
     * @param t 泛型
     * @return Optional
     */
    public static <T> Optional<T> of(T t) {
        return Objects.nonNull(t) ? Optional.of(t) : Optional.empty();
    }

    /**
     * 映射字段返回 null 则返回 null {@link Optional}
     *
     * @param t    对象
     * @param func 映射
     * @return Optional
     */
    public static <T, R> R map(T t, Function<T, R> func) {
        return Optional.ofNullable(t).map(func).orElse(null);
    }

    /**
     * 映射字段返回 null 则返回 默认值 {@link Optional}
     *
     * @param t    对象
     * @param func 映射
     * @param r    默认值
     * @return r
     */
    public static <T, R> R map(T t, Function<T, R> func, R r) {
        return Optional.ofNullable(t).map(func).orElse(r);
    }


    /**
     * 字符串非空则进行下一步操作
     *
     * @param origin   原字符串
     * @param backup   备用字符串
     * @param consumer 具体操作
     */
    public static void ofStringIfPresent(String origin, String backup, Consumer<String> consumer) {
        QtOptionalUtil.of(
                ObjectUtil.defaultIfNull(
                        QtOptionalUtil.of(origin).orElse(null),
                        QtOptionalUtil.of(backup).orElse(null)))
                .ifPresent(consumer);
    }

}
